import axios from 'axios'
import { baseURL } from '@/config'

axios.defaults.headers.post['Content-Type'] =
  'application/x-www-form-urlencoded;charset=UTF-8'
axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'

class HttpRequest {
  constructor (baseUrl = baseURL) {
    // 获取基础路径
    this.baseUrl = baseUrl
  }
  request (options) {
    // 创建实例可以使用自定义配置新建一个 axios 实例
    const instance = axios.create()
    // 将axios.create()所需要的配置对象合并起来(用户后面传如的对象与我事先配置好的对象合并起来)
    options = Object.assign(this.getInstanseConfig(), options)
    // 执行拦截器
    this.interctptors(instance)

    return instance(options)
  }
  // 设置实例初始配置对象
  getInstanseConfig () {
    const config = {
      // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
      baseURL: this.baseUrl,
      // `method` 是创建请求时使用的方法
      method: 'post', // 默认是 get
      headers: {
        // 此处也可以传cookies之类的数据
      }
    }
    return config
  }
  // 添加拦截器
  interctptors (instance) {
    // 添加请求拦截器--use函数里传入两个参数（相当于成功和是失败的对应回调函数）
    instance.interceptors.request.use(
      config => {
        // 在发送请求之前做些什么
        // config.headers.token = 984454545 // 请求头添加token(主要适合客户端传服务器返回的cookie)
        // console.log('请求数据：', config.data)
        return config // 将请求继续
      },
      error => {
        // 请求失败，返回错误原因
        return Promise.reject(error)
      }
    )
    // 添加响应拦截器--use传入use函数里传入两个参数（相当于成功和是失败的对应回调函数）,res是响应成功返回的参数，可以再次处理掉一些不需要的参数
    instance.interceptors.response.use(
      res => {
        // 对响应数据做点什么
        // console.log(res, '响应数据')
        return res.data
      },
      error => {
        // 对响应错误做点什么--比如没有token过期（401）跳转到首页
        return Promise.reject(error)
      }
    )
  }
}
export default HttpRequest
